/*
 * jxUtils Project (2014)
 * 
 * by Denilson Edinaldo Pinto
 * 
 * LGPL
 * Copyright (C) 2014
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package org.jxUtils;

import static org.jxUtils.JXConstants.ALFA;
import static org.jxUtils.JXConstants.CEP;
import static org.jxUtils.JXConstants.CNPJ;
import static org.jxUtils.JXConstants.CPF;
import static org.jxUtils.JXConstants.EMAIL;
import static org.jxUtils.JXConstants.HOUR;
import static org.jxUtils.JXConstants.HOUR_MINUTE;
import static org.jxUtils.JXConstants.HOUR_MINUTE_SECOND;
import static org.jxUtils.JXConstants.HOUR_MINUTE_SECOND_MILI;
import static org.jxUtils.JXConstants.IPv4;
import static org.jxUtils.JXConstants.IPv6;
import static org.jxUtils.JXConstants.NEGATIVE_INTEGER_NUMBER;
import static org.jxUtils.JXConstants.NEGATIVE_REAL_NUMBER;
import static org.jxUtils.JXConstants.PHONE_PT_BR;
import static org.jxUtils.JXConstants.POSITIVE_INTEGER_NUMBER;
import static org.jxUtils.JXConstants.POSITIVE_REAL_NUMBER;
import static org.jxUtils.JXConstants.RG;

import org.jxUtils.check.ParameterCheck;

/**
 * Esta classe contém Constântes de Expressão Regular.
 * 
 * @author Denilson Edinaldo Pinto
 * @porject jxUtils
 * @package org.jxUtils
 * @date 08/02/2014 - 08:44:23
 */
public final class Patterns {
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> possui apenas letras
	 * 
	 * @param value
	 */
	public static boolean isAlpha(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(ALFA);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> está no formato de um CEP
	 * 
	 * @param value
	 */
	public static boolean isCEP(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(CEP);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> está no formato de um CNPJ
	 * 
	 * @param value
	 */
	public static boolean isCNPJ(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(CNPJ);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> está no formato de um CPF
	 * 
	 * @param value
	 */
	public static boolean isCPF(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(CPF);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é a representação de um número float/double
	 * 
	 * @param value
	 */
	public static boolean isDouble(final String value) {
	
		return isNegativeDouble(value) || isPositiveDouble(value);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é um e-mail válido
	 * 
	 * @param value
	 */
	public static boolean isEmail(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(EMAIL);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> possui um valor válido para Hora
	 * 
	 * @param value
	 */
	public static boolean isHour(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(HOUR);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> possui um valor válido para Hora:Minuto
	 * 
	 * @param value
	 */
	public static boolean isHourMinute(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(HOUR_MINUTE);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> possui um valor válido para Hora:Minuto:Segundo
	 * 
	 * @param value
	 */
	public static boolean isHourMinuteSecond(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(HOUR_MINUTE_SECOND);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> possui um valor válido para Hora:Minuto:Segundo.Milisegundo
	 * 
	 * @param value
	 */
	public static boolean isHourMinuteSecondMili(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(HOUR_MINUTE_SECOND_MILI);
	}
	
	/**
	 * Verifica se o {@link Character} passado <b>value</b> é a representação de um número inteiro
	 * 
	 * @param value
	 */
	public static boolean isInteger(final Character value) {
	
		ParameterCheck.isNullOrEmpty(value, "value");
		
		return isInteger(String.valueOf(value));
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é a representação de um número inteiro
	 * 
	 * @param value
	 */
	public static boolean isInteger(final String value) {
	
		return isNegativeInteger(value) || isPositiveInteger(value);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é um IPv4
	 * 
	 * @param value
	 */
	public static boolean isIPv4(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(IPv4);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é um IPv6
	 * 
	 * @param value
	 */
	public static boolean isIPv6(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(IPv6);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é a representação de um número float/double
	 * negativo
	 * 
	 * @param value
	 */
	public static boolean isNegativeDouble(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(NEGATIVE_REAL_NUMBER);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é a representação de um número inteiro
	 * negativo
	 * 
	 * @param value
	 */
	public static boolean isNegativeInteger(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(NEGATIVE_INTEGER_NUMBER);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é a representação de um número
	 * 
	 * @param value
	 */
	public static boolean isNumber(final String value) {
	
		return isInteger(value) || isDouble(value);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> está no formato de um Telefone do Brasil
	 * 
	 * @param value
	 */
	public static boolean isPhonePTBR(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(PHONE_PT_BR);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é a representação de um número float/double
	 * positivo
	 * 
	 * @param value
	 */
	public static boolean isPositiveDouble(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(POSITIVE_REAL_NUMBER);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> é a representação de um número inteiro
	 * positivo
	 * 
	 * @param value
	 */
	public static boolean isPositiveInteger(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(POSITIVE_INTEGER_NUMBER);
	}
	
	/**
	 * Verifica se a {@link String} passada <b>value</b> está no formato de um RG
	 * 
	 * @param value
	 */
	public static boolean isRG(final String value) {
	
		ParameterCheck.isNullOrAbsoluteEmpty(value, "value");
		
		return value.matches(RG);
	}
}
